import axios from 'axios'
import { Toast } from "vant";
import { addToken, getToken, delToken } from "./token";
import JSONBig from 'json-bigint'

import router from '@/router/index.js'

const instance = axios.create({
  baseURL: 'http://toutiao-app.itheima.net', //线上基地址
  timeout: 10000, //设置网络超时，超过10秒直接作废
  transformResponse:[
    function(data){
      try{
        return JSONBig.parse(data)
      } catch{
        return data
      }
    }
  ]

})

/* 添加请求拦截器，自动上传token */
instance.interceptors.request.use(
  function (config) {
    //如果用户有登录，就自动添加token
    if (getToken()) {
      config.headers.Authorization = 'Bearer ' + getToken().token
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

/* 添加响应拦截器，拦截token过期的401错误 */
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    console.log(response)
    return response
  },
  async function (error) {
    // 对响应错误做点什么: 响应错误比如参数错误，或者没有登录等
    //(1)判断状态码 与 token是否存在
    console.log(error)
    console.log(getToken())

    if (error.response.status === 401 && getToken()) {
      /* 使用try-catch捕捉异常 */
      try {
        const tokenRes = await axios({
          url: 'http://toutiao-app.itheima.net/v1_0/authorizations',
          method: 'put',
          headers: {
            Authorization: `Bearer ${getToken().refresh_token}`
          }
        })
        //成功：更新token
        console.log('更新了token:' + tokenRes)

        let newToken = getToken()
        newToken.token = tokenRes.data.data.token
        addToken(newToken)
        // 返回当前配置信息
        return instance(error.config)
      } catch (err) {
        //请求错误，需要重新登录
        //弹窗提示
        Toast.fail('请重新登录')
        //移除token
        delToken()
        //跳转登录页
        router.push('/login')
      }
    } else {
      //弹窗提示
      Toast.fail('请重新登录')
      //移除token
      delToken()
      //跳转登录页
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

export default instance
